Security News
Oracle Drags Its Feet in the JavaScript Trademark Dispute
Oracle seeks to dismiss fraud claims in the JavaScript trademark dispute, delaying the case and avoiding questions about its right to the name.
A minimalist bytecode compiler for Node.js.
This tool truly compiles your JavaScript code into V8
bytecode, so that you can protect your source code. It can be used with Node.js, as well as Electron and NW.js (check examples/
directory).
npm install --save bytenode
Or globally:
sudo npm install -g bytenode
In Node 10.x, Bytenode does not work in debug mode. See #29.
Any code depends on Function.prototype.toString
function will break, because Bytenode removes the source code from .jsc
files and puts a dummy code instead. See #34. For a workaround, see #163
Async Arrow Functions (and Arrow Functions in general) cause crashes in Puppeteer and in Electron apps. See #106, #47. They also cause issues with the ndb debugger. See #135. It seems that whenever there is a context change (or even when called from another file or module), arrow functions break because V8
inspects them internally using Function.prototype.toString
in these cases. See #157.
Usage: bytenode [option] [ FILE... | - ] [arguments]
Options:
-h, --help show help information.
-v, --version show bytenode version.
-c, --compile [ FILE... | - ] compile stdin, a file, or a list of files
--compress compress bytecode
-n, --no-module compile without producing commonjs module
-e, --electron compile for Electron
-ep, --electron-path path to Electron executable
-l, --loader [ FILE | PATTERN ] create a loader file and optionally define
loader filename or pattern using % as
filename replacer
defaults to %.loader.js
--no-loader do not create a loader file, conflicts
with -l
-t, --loader-type type create a loader file of type commonjs or
module. Defaults to CommonJS
Examples:
$ bytenode -c script.js compile `script.js` to `script.jsc`.
$ bytenode -c server.js app.js
$ bytenode -c src/*.js compile all `.js` files in `src/` directory.
$ bytenode -c *.js -l %.load.js create `filename.load.js` loader files along side `.jsc` files
$ bytenode script.jsc [arguments] run `script.jsc` with arguments.
$ bytenode open Node REPL with bytenode pre-loaded.
Examples:
express-server.js
to express-server.jsc
.user@machine:~$ bytenode --compile express-server.js
express-server.jsc
.user@machine:~$ bytenode express-server.jsc
Server listening on port 3000
.js
files in ./app
directory.user@machine:~$ bytenode --compile ./app/*.js
.js
files in your project.user@machine:~$ bytenode --compile ./**/*.js
Note: you may need to enable globstar
option in bash (you should add it to ~/.bashrc
):
shopt -s globstar
stdin
.echo 'console.log("Hello");' | bytenode --compile - > hello.jsc
const bytenode = require('bytenode');
Generates v8 bytecode buffer.
Name | Type | Description |
---|---|---|
javascriptCode | string | JavaScript source that will be compiled to bytecode. |
{Buffer} The generated bytecode.
let helloWorldBytecode = bytenode.compileCode(
`console.log('Hello World!');
43; // this will be returned`
);
This helloWorldBytecode
bytecode can be saved to a file. However, if you want to use your code as a module (i.e. if your file has some exports
), you have to compile it using bytenode.compileFile({compileAsModule: true})
, or wrap your code manually, using Module.wrap()
function.
Asynchronous function which generates v8 bytecode buffer for Electron.
Same as bytenode.compileCode()
, but generates bytecode for the version of Electron currently installed in node_modules.
Name | Type | Description |
---|---|---|
javascriptCode | string | JavaScript source that will be compiled to bytecode. |
options | object | Options object. |
options.electronPath | string | Path to Electron executable. |
{Promise<Buffer>} A Promise which resolves with the generated bytecode.
let helloWorldBytecode = await bytenode.compileElectronCode(
`console.log('Hello World!');
43; // this will be returned`
);
This helloWorldBytecode
bytecode can be saved to a file. However, if you want to use your code as a module (i.e. if your file has some exports
), you have to compile it using bytenode.compileFile({compileAsModule: true})
, or wrap your code manually, using Module.wrap()
function.
Runs v8 bytecode buffer and returns the result.
Name | Type | Description |
---|---|---|
bytecodeBuffer | Buffer | The buffer object that was created using compileCode function. |
{any} The result of the very last statement executed in the script.
const result = bytenode.runBytecode(helloWorldBytecode);
// prints: Hello World!
console.log(result)
// prints: 43
Asynchronous function which compiles JavaScript file to .jsc file.
Name | Type | Description |
---|---|---|
args | object | string | |
args.filename | string | The JavaScript source file that will be compiled. |
args.compileAsModule | boolean | If true, the output will be a commonjs module. Default: true. |
args.electron | boolean | If true, the output will be a compiled through Electron. Default: false. |
args.electronPath | string | Path to Electron executable. Default: Electron binary from node_modules. |
args.output | string | The output filename. Defaults to the same path and name of the original file, but with .jsc extension. |
args.createLoader | boolean | string | If true, create a CommonJS loader file. As a string, select between module or commonjs loader. Default: false |
args.loaderFilename | string | Filename or pattern for generated loader files. Defaults to originalFilename.loader.js. Use % as a substitute for originalFilename. |
output | string | The output filename. (Deprecated: use args.output instead) |
{Promise<string>}: A Promise that resolves as the compiled filename.
let compiledFilename = bytenode.compileFile({
filename: '/path/to/your/file.js',
output: '/path/to/compiled/file.jsc' // if omitted, it defaults to '/path/to/your/file.jsc'
});
Previous code will produce a commonjs module that can be required using require
function.
let compiledFilename = await bytenode.compileFile({
filename: '/path/to/your/file.js',
output: '/path/to/compiled/file.jsc',
compileAsModule: false
});
Previous code will produce a direct .jsc
file, that can be run using bytenode.runBytecodeFile()
function. It can NOT be required as a module. Please note that compileAsModule
MUST be false
in order to turn it off. Any other values (including: null
, ""
, etc) will be treated as true
. (It had to be done this way in order to keep the old code valid.)
Runs .jsc file and returns the result.
Name | Type |
---|---|
filename | string |
{any} The result of the very last statement executed in the script.
// test.js
console.log('Hello World!');
43; // this will be returned
const result = bytenode.runBytecodeFile('/path/to/test.jsc');
// prints: Hello World!
console.log(result)
// prints: 43
Name | Type |
---|---|
filename | string |
{any} exported module content
let myModule = require('/path/to/your/file.jsc');
Just like regular .js
modules. You can also omit the extension .jsc
.
.jsc
file must have been compiled using bytenode.compileFile()
, or have been wrapped inside Module.wrap()
function. Otherwise it won't work as a module and it can NOT be required.
Please note .jsc
files must run with the same Node.js version that was used to compile it (using same architecture of course). Also, .jsc
files are CPU-agnostic. However, you should run your tests before and after deployment, because V8 sanity checks include some checks related to CPU supported features, so this may cause errors in some rare cases.
I had the idea of this tool many years ago. However, I finally decided to implement it after seeing this issue by @hashseed. Also, some parts were inspired by v8-compile-cache by @zertosh.
FAQs
A minimalist bytecode compiler for Node.js
The npm package bytenode receives a total of 7,015 weekly downloads. As such, bytenode popularity was classified as popular.
We found that bytenode demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 2 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Oracle seeks to dismiss fraud claims in the JavaScript trademark dispute, delaying the case and avoiding questions about its right to the name.
Security News
The Linux Foundation is warning open source developers that compliance with global sanctions is mandatory, highlighting legal risks and restrictions on contributions.
Security News
Maven Central now validates Sigstore signatures, making it easier for developers to verify the provenance of Java packages.